/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Pe.edu.unmsm.SIASS.DAOImpl;

import Pe.edu.unmsm.SIASS.DAO.*;
import Pe.edu.unmsm.SIASS.Dominio.*;
import Util.HibernateUtil;
import java.util.Date;
import java.sql.Time;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author FELIPE
 */
public class AsistenciaDaoImpl implements AsistenciaDAO {

    @Override
    public void guardarAsistencia(int idHorarioGrupo, int idSesion, Date dia, Date horaRegistro, int idEstado, int idAlumno) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        AlumnoDAO alumnoDAO = new AlumnoDAOImpl();
        HorarioGrupoDAO horarioGrupoDAO = new HorarioGrupoDAOImpl();
        SesionDAO sesionDAO = new SesionDAOImpl();
        EstadoDAO estadoDAO = new EstadoDAOImpl();
        Alumno alumno = new Alumno();
        Asistencia asistencia = new Asistencia();
        HorarioGrupo horarioGrupo = new HorarioGrupo();
        Estado estado = new Estado();
        Sesion sesion = new Sesion();
        System.out.println("GRABAR: " + idAlumno + " y estado: " + idEstado);
        System.out.println("HG: " + idHorarioGrupo + " S: " + idSesion);
        System.out.println("DIA: " + dia.getDay() + " Hora: " + horaRegistro.getHours());

        alumno = alumnoDAO.buscarAlumno(idAlumno);
        horarioGrupo = horarioGrupoDAO.buscarHorarioGrupo(idHorarioGrupo);
        sesion = sesionDAO.buscarSesion(idSesion);
        estado = estadoDAO.buscarEstado(idEstado);

        System.out.println("Alumno: " + alumno.getPersona().getNombres());

        asistencia.setIdAsistencia(null);
        asistencia.setEstado(estado);
        asistencia.setHorarioGrupo(horarioGrupo);
        asistencia.setAlumno(alumno);
        asistencia.setSesion(sesion);
        asistencia.setDia(dia);
        asistencia.setHoraRegistro(horaRegistro);
        session.save(asistencia);
        session.getTransaction().commit();

    }

    @Override
    public Asistencia obtenerAsistencia(int idHorarioGrupo, int idSesion, int idAlumno) {
        Transaction tx = null;
        Asistencia a = null;
        try {
            Session session = HibernateUtil.getSessionFactory().openSession();
            tx = session.beginTransaction();

            a = (Asistencia) session.createQuery("FROM Asistencia WHERE horarioGrupo.idHorGrupo=" + idHorarioGrupo + ""
                    + " and sesion.idSesion=" + idSesion + " and alumno.idalumno=" + idAlumno).uniqueResult();
            if (a != null) {
                Hibernate.initialize(a.getAlumno());
                Hibernate.initialize(a.getEstado());
                Hibernate.initialize(a.getHorarioGrupo());
                Hibernate.initialize(a.getSesion());
                session.beginTransaction().commit();
            }
            session.close();
        } catch (HibernateException e) {
            if (tx != null) {
                tx.rollback();
            }
            System.out.println("Error: " + e.getMessage());

        }
        return a;


    }

    @Override
    public boolean modificarAsistencia(Asistencia a) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            session.beginTransaction();
            session.update(a);
            session.beginTransaction().commit();
            session.close();
            return true;
        } catch (Exception e) {
            System.err.println("A");
            session.beginTransaction().rollback();
            e.printStackTrace();
            return false;
        }
    }

    @Override
    public List<Asistencia> obtenerListAsistencia(int idCurso, int idModDictado, Date fecha) {
        System.out.println("curso:" + idCurso + " modid:" + idModDictado + " date:" + fecha.toString());
        List<Asistencia> lista = new ArrayList<Asistencia>();
        List<Asistencia> lista1 = new ArrayList<Asistencia>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        try {
            session.beginTransaction();
            Query query = session.createQuery("select distinct a from Asistencia a where "
                    + "horarioGrupo.modalidadDictado.idModalidad=" + idModDictado + " and horarioGrupo.grupo.cursoPeriodo.curso.idCurso=" + idCurso);
            lista = (List<Asistencia>) query.list();
            System.out.println("size:"+lista.size());
            for (Asistencia asist : lista) {
                System.out.println("feee:"+asist.getDia().getDate()+" - "+ asist.getDia().getMonth()+" - "+ asist.getDia().getYear());
                System.out.println("faaa: "+fecha.getDate()+" - "+fecha.getMonth()+" - "+fecha.getYear());
                if (fecha.getDate() == asist.getDia().getDate() && fecha.getMonth() == (asist.getDia().getMonth())
                        && fecha.getYear() == asist.getDia().getYear()) {
                    lista1.add(asist);
                    Hibernate.initialize(asist.getAlumno());
                    Hibernate.initialize(asist.getAlumno().getPersona());
                    Hibernate.initialize(asist.getEstado());
                    Hibernate.initialize(asist.getSesion());
                }

            }
            session.beginTransaction().commit();
            session.close();
        } catch (Exception e) {
            session.beginTransaction().rollback();
            e.printStackTrace();
        }
        return lista1;
    }
}
